home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume27 / dmake / part13 < prev    next >
Encoding:
Text File  |  1992-01-29  |  40.0 KB  |  1,291 lines

  1. Newsgroups: comp.sources.misc
  2. From: dvadura@plg.waterloo.edu (Dennis Vadura)
  3. Subject:  v27i114:  dmake - dmake Version 3.8, Part13/41
  4. Message-ID: <1992Jan28.031558.7569@sparky.imd.sterling.com>
  5. X-Md4-Signature: 8cf1e2a7623414996c3b19f5ac4390c3
  6. Date: Tue, 28 Jan 1992 03:15:58 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dvadura@plg.waterloo.edu (Dennis Vadura)
  10. Posting-number: Volume 27, Issue 114
  11. Archive-name: dmake/part13
  12. Environment: Atari-ST, Coherent, Mac, MSDOS, OS/2, UNIX
  13. Supersedes: dmake: Volume 19, Issue 22-58
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. # this is dmake.shar.13 (part 13 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file dmake/make.c continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 13; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test -f _shar_wnt_.tmp; then
  33. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/make.c' &&
  34. X     }
  35. X      }
  36. X
  37. X      tcp->ce_flag |= F_VISITED;
  38. X
  39. X      /* Note:  If the prerequisite was made using a .SETDIR= attribute
  40. X       *     directory then we will include the directory in the fname
  41. X       *        of the target.  */
  42. X      if( push ) {
  43. X     char *dir   = nsetdirroot ? nsetdirroot->ce_dir : Makedir;
  44. X     char *nname = Build_path(_prefix(dir,tcp->ce_dir), tcp->ce_fname);
  45. X
  46. X     if( (tcp->ce_attr & A_FFNAME) && (tcp->ce_fname != NIL(char)) )
  47. X        FREE( tcp->ce_fname );
  48. X
  49. X     tcp->ce_fname = _strdup(nname);
  50. X     tcp->ce_attr |= A_FFNAME;
  51. X      }
  52. X
  53. X      tcp = tcp->ce_all;
  54. X   }
  55. X   while( tcp != NIL(CELL) && tcp != cp );
  56. X
  57. stop_making_it:
  58. X   _drop_mac( m_g  );
  59. X   _drop_mac( m_q  );
  60. X   _drop_mac( m_b  );
  61. X   _drop_mac( m_l  );
  62. X   _drop_mac( m_bb );
  63. X   _drop_mac( m_up );
  64. X   _drop_mac( m_at );
  65. X
  66. X   while( push-- )  Pop_dir(FALSE);
  67. X
  68. X   if( inf    != NIL(char) ) FREE( inf    );
  69. X   if( all    != NIL(char) ) FREE( all    );
  70. X   if( imm    != NIL(char) ) FREE( imm    );
  71. X   if( outall != NIL(char) ) FREE( outall );
  72. X
  73. X   DB_PRINT( "mem", ("%s:-< mem %ld", cp->CE_NAME, (long) coreleft()) );
  74. X   DB_RETURN( rval );
  75. }
  76. X
  77. X
  78. static char *
  79. _prefix( pfx, pat )
  80. char *pfx;
  81. char *pat;
  82. {
  83. X   char *opat = pat;
  84. X   while( *pfx && *pat && *pfx++ == *pat++ );
  85. X
  86. X   return( !*pfx ? _strspn(pat,DirBrkStr) : opat );
  87. }
  88. X
  89. X
  90. static LINKPTR
  91. _dup_prq( lp )
  92. LINKPTR lp;
  93. {
  94. X   LINKPTR tlp;
  95. X
  96. X   if( lp == NIL(LINK) ) return(lp);
  97. X
  98. X   TALLOC(tlp, 1, LINK);
  99. X   *tlp = *lp;
  100. X   tlp->cl_next = _dup_prq( lp->cl_next );
  101. X
  102. X   return(tlp);
  103. }
  104. X
  105. X
  106. static void
  107. _drop_mac( hp )/*
  108. ================ set a macro value to zero. */
  109. HASHPTR hp;
  110. {
  111. X   if( hp && hp->ht_value != NIL(char) ) {
  112. X      FREE( hp->ht_value );
  113. X      hp->ht_value = NIL(char);
  114. X   }
  115. }
  116. X
  117. X
  118. X
  119. int
  120. _explode_graph( cp, parent, setdirroot )/*
  121. ==========================================
  122. X   Check to see if we have made the node already.  If so then don't do
  123. X   it again, except if the cell's ce_setdir field is set to something other
  124. X   than the value of setdirroot.  If they differ then, and we have made it
  125. X   already, then make it again and set the cell's stat bit to off so that
  126. X   we do the stat again.  */
  127. CELLPTR cp;
  128. LINKPTR parent;
  129. CELLPTR setdirroot;
  130. {
  131. X   /* we may return if we made it already from the same setdir location,
  132. X    * or if it is not a library member whose lib field is non NULL.  (if
  133. X    * it is such a member then we have a line of the form:
  134. X    *    lib1 lib2 .LIBRARY : member_list...
  135. X    * and we have to make sure all members are up to date in both libs. */
  136. X
  137. X   if( cp->ce_setdir == setdirroot &&
  138. X       !((cp->ce_attr & A_LIBRARYM) && (cp->ce_lib != NIL(char))) )
  139. X      return( 0 );
  140. X
  141. X   /* We check to make sure that we are comming from a truly different
  142. X    * directory, ie. ".SETDIR=joe : a.c b.c d.c" are all assumed to come
  143. X    * from the same directory, even though setdirroot is different when
  144. X    * making dependents of each of these targets. */
  145. X
  146. X   if( cp->ce_setdir != NIL(CELL) &&
  147. X       setdirroot != NIL(CELL) &&
  148. X       cp->ce_dir &&
  149. X       setdirroot->ce_dir &&
  150. X       !strcmp(cp->ce_dir, setdirroot->ce_dir) )
  151. X      return( 0 );
  152. X
  153. X   if( Max_proc > 1 ) {
  154. X      if( parent == NIL(LINK) )
  155. X     Fatal( "Internal Error:  NIL parent in Make()" );
  156. X
  157. X      TALLOC(parent->cl_prq, 1, CELL);
  158. X      *parent->cl_prq = *cp;
  159. X      cp = parent->cl_prq;
  160. X      cp->ce_prq = _dup_prq(cp->ce_prq);
  161. X   }
  162. X   cp->ce_flag  &= ~(F_STAT|F_VISITED|F_MADE);
  163. X
  164. X   /* Indicate that we exploded the graph and that the current node should
  165. X    * be made. */
  166. X   return(1);
  167. }
  168. X
  169. X
  170. X
  171. PUBLIC int
  172. Exec_commands( cp )/*
  173. =====================
  174. X  Execute the commands one at a time that are pointed to by the rules pointer
  175. X  of the target cp. If a group is indicated, then the ce_attr determines
  176. X  .IGNORE and .SILENT treatment for the group.
  177. X  
  178. X  The function returns 0, if the command is executed and has successfully
  179. X  returned, and returns 1 if the command is executing but has not yet
  180. X  returned (for parallel makes).
  181. X  
  182. X  The F_MADE bit in the cell is guaranteed set when the command has
  183. X  successfully completed.  */
  184. CELLPTR cp;
  185. {
  186. X   static HASHPTR useshell = NIL(HASH);
  187. X   static HASHPTR command  = NIL(HASH);
  188. X   static         int   read_cmnd = 0;
  189. X   register STRINGPTR    rp;
  190. X   STRINGPTR            orp;
  191. X   char            *cmnd;
  192. X   char            *groupfile;
  193. X   FILE            *tmpfile;
  194. X   int            do_it;
  195. X   t_attr        attr;
  196. X   int            group;
  197. X   int            trace;
  198. X   int            rval  = 0;
  199. X
  200. X   DB_ENTER( "Exec_commands" );
  201. X
  202. X   attr  = Glob_attr | cp->ce_attr;
  203. X   trace = Trace || !(attr & A_SILENT);
  204. X   group = cp->ce_flag & F_GROUP;
  205. X
  206. X   /* Do it again here for those that call us from places other than Make()
  207. X    * above. */
  208. X   orp = _recipes[ RP_RECIPE ];
  209. X   _recipes[ RP_RECIPE ] = cp->ce_recipe;
  210. X
  211. X   if( group ) {
  212. X      /* Leave this assignment of Current_target here.  It is needed just
  213. X       * incase the user hits ^C after the tempfile for the group recipe
  214. X       * has been opened. */
  215. X      Current_target = cp;
  216. X      trace  = Trace || !(attr & A_SILENT);
  217. X
  218. X      if( !Trace ) tmpfile = Start_temp( Grp_suff, cp, &groupfile );
  219. X      if( trace )  fputs( "[\n", stdout );
  220. X
  221. X      /* Emit group prolog */
  222. X      if( attr & A_PROLOG )
  223. X         _append_file( _recipes[RP_GPPROLOG], tmpfile, cp->CE_NAME, trace );
  224. X   }
  225. X
  226. X   if( !useshell  ) useshell=Def_macro("USESHELL",NIL(char),M_MULTI|M_EXPANDED);
  227. X   if( !read_cmnd ) {command = GET_MACRO("COMMAND"); read_cmnd = 1;}
  228. X
  229. X   /* Process commands in recipe. If in group, merely append to file.
  230. X    * Otherwise, run them.  */
  231. X   for( rp = _recipes[RP_RECIPE]; rp != NIL(STRING); rp=rp->st_next,FREE(cmnd)){
  232. X      t_attr a_attr = A_DEFAULT;
  233. X      t_attr l_attr;
  234. X      char   *p;
  235. X      int    new_attr = FALSE;
  236. X      int    shell;
  237. X
  238. X      /* Reset it for each recipe line otherwise tempfiles don't get removed.
  239. X       * Since processing of $(mktmp ...) depends on Current_target being
  240. X       * correctly set. */
  241. X      Current_target = cp;
  242. X
  243. X      /* Only check for +,-,%,@ if the recipe line begins with a '$' macro
  244. X       * expansion.  Otherwise there is no way it is going to find these
  245. X       * now. */
  246. X      if( *rp->st_string == '$' && !group ) {
  247. X         t_attr s_attr = Glob_attr;
  248. X     Glob_attr |= A_SILENT;
  249. X     Suppress_temp_file = TRUE;
  250. X     cmnd = Expand(rp->st_string);
  251. X     Suppress_temp_file = FALSE;
  252. X     a_attr |= Rcp_attribute(cmnd);
  253. X     FREE(cmnd);
  254. X     ++new_attr;
  255. X     Glob_attr = s_attr;
  256. X      }
  257. X
  258. X      l_attr = attr|a_attr|rp->st_attr;
  259. X      shell  = ((l_attr & A_SHELL) != 0);
  260. X      useshell->ht_value = (group||shell)?"yes":"no";
  261. X
  262. X      cmnd = Expand( rp->st_string );
  263. X
  264. X      if( new_attr ) {
  265. X     char *ecmnd = cmnd;
  266. X     cmnd = _strdup(_strspn(cmnd, " \t\n+-@%"));
  267. X     FREE(ecmnd);
  268. X      }
  269. X
  270. X      /* COMMAND macro is set to "$(CMNDNAME) $(CMNDARGS)" by default, it is
  271. X       * possible for the user to reset it to, for example
  272. X       *    COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS))
  273. X       * in order to get a different interface for his command execution. */
  274. X      if( command != NIL(HASH) && !group && *(p = _strpbrk(cmnd, " \t\n")) ) {
  275. X     char *cname = cmnd;
  276. X
  277. X     *p = '\0';
  278. X     (void) Def_macro("CMNDNAME",cname,M_MULTI|M_EXPANDED);
  279. X     (void) Def_macro("CMNDARGS",p+1,M_MULTI|M_EXPANDED);
  280. X
  281. X     cmnd = Expand("$(COMMAND)");
  282. X     FREE(cname);             /* cname == cmnd at this point. */
  283. X      }
  284. X
  285. X      Swap_on_exec = ((l_attr & A_SWAP) != 0);      /* Swapping for DOS only */
  286. X      do_it = !Trace;
  287. X
  288. X      if( !group && Trace && _strstr(rp->st_string,"$(MAKE)") ) {
  289. X     Wait_for_completion |= Trace;
  290. X     do_it = TRUE;
  291. X      }
  292. X
  293. X      if( group )
  294. X         Append_line( cmnd, TRUE, tmpfile, cp->CE_NAME, trace, 0 );
  295. X      else {
  296. X     if( *_strspn(cmnd, " \t") != '\0' )
  297. X        Print_cmnd(cmnd, !(do_it && (l_attr & A_SILENT)), 0);
  298. X     else
  299. X        do_it = FALSE;
  300. X
  301. X     rval=Do_cmnd(cmnd,FALSE,do_it,cp,(l_attr&A_IGNORE)!=0, shell,
  302. X              rp->st_next == NIL(STRING) );
  303. X      }
  304. X   }
  305. X
  306. X   /* If it is a group then output the EPILOG if required and possibly
  307. X    * execute the command */
  308. X   if( group ) {
  309. X      if( attr & A_EPILOG )    /* emit epilog */
  310. X     _append_file( _recipes[RP_GPEPILOG], tmpfile, cp->CE_NAME, trace );
  311. X
  312. X      if( trace ) fputs("]\n", stdout);
  313. X
  314. X      if( do_it = !Trace ) Close_temp( cp, tmpfile );
  315. X      rval = Do_cmnd(groupfile, TRUE, do_it, cp, (attr & A_IGNORE)!=0,
  316. X             TRUE, TRUE);
  317. X   }
  318. X
  319. X   Wait_for_completion = FALSE;
  320. X   _recipes[ RP_RECIPE ] = orp;
  321. X   DB_RETURN( rval );
  322. }
  323. X
  324. X
  325. PUBLIC void
  326. Print_cmnd( cmnd, echo, map )/*
  327. ================================
  328. X   This routine is called to print out the command to stdout.  If echo is
  329. X   false the printing to stdout is supressed, but the new lines in the command
  330. X   are still deleted. */
  331. char *cmnd;
  332. int  echo;
  333. int  map;
  334. {
  335. X   register char *p;
  336. X   register char *n;
  337. X   char tmp[3];
  338. X
  339. X   DB_ENTER( "Print_cmnd" );
  340. X
  341. X   if( echo ) {
  342. X      printf( "%s\n", cmnd  );
  343. X      fflush(stdout);
  344. X   }
  345. X
  346. X   tmp[0] = ESCAPE_CHAR;
  347. X   tmp[1] = CONTINUATION_CHAR;
  348. X   tmp[2] = '\0';
  349. X
  350. X   for( p=cmnd; *(n = _strpbrk(p,tmp)) != '\0'; )
  351. X      if(*n == CONTINUATION_CHAR && n[1] == '\n') {
  352. X     DB_PRINT( "make", ("fixing [%s]", p) );
  353. X     strcpy( n, n+2 );
  354. X     p = n;
  355. X      }
  356. X      else {
  357. X         if( *n == ESCAPE_CHAR && map ) Map_esc( n );
  358. X     p = n+1;
  359. X      }
  360. X
  361. X   DB_VOID_RETURN;
  362. }
  363. X
  364. X
  365. X
  366. /* These routines are used to maintain a stack of directories when making
  367. X * the targets.  If a target cd's to the directory then it is assumed that
  368. X * it will undo it when it is finished making itself. */
  369. X
  370. static STRINGPTR dir_stack = NIL(STRING);
  371. X
  372. int
  373. Push_dir( dir, name, ignore )/*
  374. ===============================
  375. X   Change the current working directory to dir and save the current
  376. X   working directory on the stack so that we can come back.
  377. X   
  378. X   If ignore is TRUE then do not complain about _ch_dir if not possible.*/
  379. char *dir;
  380. char *name;
  381. int  ignore;
  382. {
  383. X   STRINGPTR   new_dir;
  384. X
  385. X   DB_ENTER( "Push_dir" );
  386. X
  387. X   if( dir == NIL(char)  || *dir == '\0' ) dir = Pwd;
  388. X   if( *dir == '\'' && dir[strlen(dir)-1] == '\'' ) {
  389. X      dir = _strdup(dir+1);
  390. X      dir[strlen(dir)-1]='\0';
  391. X   }
  392. X   else
  393. X      dir = Expand(dir);
  394. X
  395. X   if( Set_dir(dir) ) {
  396. X      if( !ignore )
  397. X         Fatal( "Unable to change to directory `%s', target is [%s]",
  398. X            dir, name );
  399. X      FREE(dir);
  400. X      DB_RETURN( 0 );
  401. X   }
  402. X
  403. X   DB_PRINT( "dir", ("Push: [%s]", dir) );
  404. X   if( Verbose & V_PRINT_DIR )
  405. X      printf( "%s:  Changed to directory [%s]\n", Pname, dir  );
  406. X
  407. X   FREE( dir );
  408. X   TALLOC( new_dir, 1, STRING );
  409. X   new_dir->st_next   = dir_stack;
  410. X   dir_stack          = new_dir;
  411. X   new_dir->st_string = _strdup( Pwd );
  412. X
  413. X   Def_macro( "PWD", Get_current_dir(), M_MULTI | M_EXPANDED );
  414. X   _set_tmd();
  415. X
  416. X   DB_RETURN( 1 );
  417. }
  418. X
  419. X
  420. X
  421. PUBLIC void
  422. Pop_dir(ignore)/*
  423. =================
  424. X   Change the current working directory to the previous saved dir. */
  425. int ignore;
  426. {
  427. X   STRINGPTR old_dir;
  428. X   char      *dir;
  429. X
  430. X   DB_ENTER( "Pop_dir" );
  431. X
  432. X   if( dir_stack == NIL(STRING) )
  433. X      if( ignore ) {
  434. X         DB_VOID_RETURN;
  435. X      }
  436. X      else
  437. X     Error( "Directory stack empty for return from .SETDIR" );
  438. X
  439. X   if( Set_dir(dir = dir_stack->st_string) )
  440. X      Fatal( "Could not change to directory `%s'", dir );
  441. X
  442. X   Def_macro( "PWD", dir, M_MULTI | M_EXPANDED );
  443. X   DB_PRINT( "dir", ("Pop: [%s]", dir) );
  444. X   if( Verbose & V_PRINT_DIR )
  445. X      printf( "%s:  Changed back to directory [%s]\n", Pname, dir);
  446. X
  447. X   old_dir   = dir_stack;
  448. X   dir_stack = dir_stack->st_next;
  449. X
  450. X   FREE( old_dir->st_string );
  451. X   FREE( old_dir );
  452. X   _set_tmd();
  453. X
  454. X   DB_VOID_RETURN;
  455. }
  456. X
  457. X
  458. X
  459. static void
  460. _set_tmd()/*
  461. ============
  462. X   Set the TWD Macro */
  463. {
  464. X   TKSTR md, pd;
  465. X   char  *m, *p;
  466. X   char  *tmd;
  467. X   int   is_sep;
  468. X   int   first = 1;
  469. X
  470. X   SET_TOKEN( &md, Makedir );
  471. X   SET_TOKEN( &pd, Pwd );
  472. X
  473. X   m = Get_token( &md, DirBrkStr, FALSE );
  474. X   (void) Get_token( &pd, DirBrkStr, FALSE );
  475. X   is_sep = (strchr(DirBrkStr, *m) != NIL(char));
  476. X   tmd = _strdup( "" );
  477. X
  478. X   do {
  479. X      m = Get_token( &md, DirBrkStr, FALSE );
  480. X      p = Get_token( &pd, DirBrkStr, FALSE );
  481. X
  482. X      if( !is_sep && strcmp(m, p) ) {    /* they differ */
  483. X     char *tmp;
  484. X     if( first ) {        /* They differ in the first component    */
  485. X        tmd = Makedir;    /* In this case use the full path    */
  486. X        break;
  487. X     }
  488. X
  489. X     if( *p ) tmp = Build_path( "..", tmd );
  490. X     if( *m ) tmp = Build_path( tmd, m );
  491. X     FREE( tmd );
  492. X     tmd = _strdup( tmp );
  493. X      }
  494. X
  495. X      is_sep = 1-is_sep;
  496. X      first  = 0;
  497. X   } while (*m || *p);
  498. X
  499. X   CLEAR_TOKEN( &md );
  500. X   CLEAR_TOKEN( &pd );
  501. X
  502. X   Def_macro( "TMD", tmd, M_MULTI | M_EXPANDED );
  503. X   if( tmd != Makedir ) FREE( tmd );
  504. }
  505. X
  506. X
  507. static void
  508. _set_recipe( target, ind )/*
  509. ============================
  510. X   Set up the _recipes static variable so that the slot passed in points
  511. X   at the rules corresponding to the target supplied. */
  512. char *target;
  513. int  ind;
  514. {
  515. X   CELLPTR cp;
  516. X   HASHPTR hp;
  517. X
  518. X   if( (hp = Get_name(target, Defs, FALSE)) != NIL(HASH) ) {
  519. X      cp = hp->CP_OWNR;
  520. X      _recipes[ ind ] = cp->ce_recipe;
  521. X   }
  522. X   else
  523. X      _recipes[ ind ] = NIL(STRING);
  524. }
  525. X
  526. X
  527. X
  528. PUBLIC void
  529. Append_line( cmnd, newline, tmpfile, name, printit, map )
  530. char *cmnd;
  531. int  newline;
  532. FILE *tmpfile;
  533. char *name;
  534. int  printit;
  535. int  map;
  536. {
  537. X   Print_cmnd( cmnd, printit, map );
  538. X
  539. X   if( Trace ) return;
  540. X
  541. X   fputs(cmnd, tmpfile);
  542. X   if( newline ) fputc('\n', tmpfile);
  543. X   fflush(tmpfile);
  544. X
  545. X   if( ferror(tmpfile) )
  546. X      Fatal("Write error on temporary file, while processing `%s'", name);
  547. }
  548. X
  549. X
  550. X
  551. static void
  552. _append_file( rp, tmpfile, name, printit )
  553. register STRINGPTR rp;
  554. FILE            *tmpfile;
  555. char            *name;
  556. int            printit;
  557. {
  558. X   char *cmnd;
  559. X
  560. X   while( rp != NIL(STRING) ) {
  561. X      Append_line(cmnd = Expand(rp->st_string), TRUE, tmpfile, name, printit,0);
  562. X      FREE(cmnd);
  563. X      rp = rp->st_next;
  564. X   }
  565. }
  566. X
  567. X
  568. #define NUM_BUCKETS    20
  569. X
  570. typedef struct strpool {
  571. X   char       *string;    /* a pointer to the string value */
  572. X   uint32      keyval;    /* the strings hash value     */
  573. X   struct strpool *next;    /* hash table link pointer     */
  574. } POOL, *POOLPTR;
  575. X
  576. static POOLPTR strings[ NUM_BUCKETS ];
  577. X
  578. static char *
  579. _pool_lookup( str )/*
  580. =====================
  581. X   Scan down the list of chained strings and see if one of them matches
  582. X   the string we are looking for. */
  583. char    *str;
  584. {
  585. X   register POOLPTR key;
  586. X   uint32   keyval;
  587. X   uint16   hv;
  588. X   uint16   keyindex;
  589. X   char     *string;
  590. X
  591. X   DB_ENTER( "_pool_lookup" );
  592. X
  593. X   if( str == NIL(char) ) DB_RETURN("");
  594. X
  595. X   hv  = Hash(str, &keyval);
  596. X   key = strings[ keyindex = (hv % NUM_BUCKETS) ];
  597. X
  598. X   while( key != NIL(POOL) )
  599. X      if( (key->keyval != keyval) || strcmp(str, key->string) )
  600. X     key = key->next;
  601. X      else
  602. X     break;
  603. X
  604. X   if( key == NIL(POOL) ) {
  605. X      DB_PRINT( "pool", ("Adding string [%s]", str) );
  606. X      TALLOC( key, 1, POOL );            /* not found so add string */
  607. X      
  608. X      key->string = string = _strdup(str);
  609. X      key->keyval = keyval;
  610. X
  611. X      key->next           = strings[ keyindex ];
  612. X      strings[ keyindex ] = key;
  613. X   }
  614. X   else {
  615. X      DB_PRINT( "pool", ("Found string [%s], key->string") );
  616. X      string = key->string;
  617. X   }
  618. X
  619. X   DB_RETURN( string );
  620. }
  621. SHAR_EOF
  622. chmod 0640 dmake/make.c ||
  623. echo 'restore of dmake/make.c failed'
  624. Wc_c="`wc -c < 'dmake/make.c'`"
  625. test 28699 -eq "$Wc_c" ||
  626.     echo 'dmake/make.c: original size 28699, current size' "$Wc_c"
  627. rm -f _shar_wnt_.tmp
  628. fi
  629. # ============= dmake/make.cmd ==============
  630. if test -f 'dmake/make.cmd' -a X"$1" != X"-c"; then
  631.     echo 'x - skipping dmake/make.cmd (File already exists)'
  632.     rm -f _shar_wnt_.tmp
  633. else
  634. > _shar_wnt_.tmp
  635. sed 's/^X//' << 'SHAR_EOF' > 'dmake/make.cmd' &&
  636. echo off
  637. cls
  638. rem  *** This is the make command file that is used under OS/2 to make the
  639. rem  *** first version of dmake.  It isn't pretty but it does work, assuming
  640. rem  *** the compilers have been correctly setup.
  641. rem
  642. echo Running make.cmd script to make a %1 copy of dmake.
  643. X
  644. if %0%1 == %0 goto error
  645. if %1 == msc40 goto mkmsc40
  646. if %1 == msc50 goto mkmsc50
  647. if %1 == msc51 goto mkmsc51
  648. if %1 == msc60 goto mkmsc60
  649. if %1 == ibm   goto mkibm
  650. X
  651. rem label the possible DOS variations for dmake here.
  652. :error
  653. echo OS/2 INDEX:  You must specify one of:
  654. echo ------------------
  655. echo    msc40    - Microsoft C 4.0 compile.
  656. echo    msc50    - Microsoft C 5.0 compile.
  657. echo    msc51    - Microsoft C 5.1 compile.
  658. echo    msc60    - Microsoft C 6.0 compile.
  659. 3cho    ibm      - IBM C 2.0 compile.
  660. goto end
  661. X
  662. rem This is the script that makes dmake using Microsoft C 4.0
  663. :mkmsc40
  664. os2\mscdos\mk40.cmd
  665. goto end
  666. X
  667. rem This is the script that makes dmake using Microsoft C 5.0
  668. :mkmsc50
  669. os2\mscdos\mk50.cmd
  670. goto end
  671. X
  672. rem This is the script that makes dmake using Microsoft C 5.1
  673. :mkmsc51
  674. os2\mscdos\mk51.cmd
  675. goto end
  676. X
  677. rem This is the script that makes dmake using Microsoft C 6.0
  678. :mkmsc60
  679. os2\mscdos\mk60.cmd
  680. goto end
  681. X
  682. rem This is the script that makes dmake using Microsoft C 6.0
  683. :ibm
  684. os2\ibm\mkc2.cmd
  685. goto end
  686. X
  687. rem All done!
  688. :end
  689. SHAR_EOF
  690. chmod 0640 dmake/make.cmd ||
  691. echo 'restore of dmake/make.cmd failed'
  692. Wc_c="`wc -c < 'dmake/make.cmd'`"
  693. test 1310 -eq "$Wc_c" ||
  694.     echo 'dmake/make.cmd: original size 1310, current size' "$Wc_c"
  695. rm -f _shar_wnt_.tmp
  696. fi
  697. # ============= dmake/makefile.mk ==============
  698. if test -f 'dmake/makefile.mk' -a X"$1" != X"-c"; then
  699.     echo 'x - skipping dmake/makefile.mk (File already exists)'
  700.     rm -f _shar_wnt_.tmp
  701. else
  702. > _shar_wnt_.tmp
  703. sed 's/^X//' << 'SHAR_EOF' > 'dmake/makefile.mk' &&
  704. #             //// Makefile for DMAKE. \\\\
  705. # The target system is characterized by the following macros imported from
  706. # the environment.
  707. #
  708. #    OS          - gives the class of operating system
  709. #    OSRELEASE     - optionally gives the particular release of the OS above.
  710. #    OSENVIRONMENT - optionally gives the environment under which the above
  711. #            OS is in use.
  712. #
  713. # For valid values for the above macros consult the readme/* files or type
  714. # 'make' by itself to get a summary of what is available.
  715. X
  716. # First target in the makefile, do this so that targets declared in the
  717. # included files are never marked as being the first *default* target.
  718. first : all ;
  719. X
  720. #Enable keeping of state for future compiles
  721. .KEEP_STATE := _state.mk
  722. X
  723. # Pull in the configuration macros, from the environment.  OS is required,
  724. # OSRELEASE, and OSENVIRONMENT are optional.
  725. .IF $(OS) == $(NULL)
  726. X   .IMPORT : OS
  727. .END
  728. .IMPORT .IGNORE : OSRELEASE OSENVIRONMENT TMPDIR
  729. X
  730. # Define $(PUBLIC)
  731. _osenv  := $(OSENVIRONMENT)$(DIRSEPSTR)
  732. _osre   := $(OSRELEASE)$(DIRSEPSTR)$(!null,$(OSENVIRONMENT) $(_osenv))
  733. ENVDIR   = $(OS)$(DIRSEPSTR)$(!null,$(OSRELEASE) $(_osre))
  734. PUBLIC   = $(ENVDIR)public.h
  735. STARTUP := startup.mk
  736. X
  737. # Define the source files
  738. SRC =\
  739. X    infer.c make.c stat.c expand.c dmstring.c hash.c dag.c dmake.c\
  740. X    path.c imacs.c sysintf.c parse.c getinp.c quit.c state.c\
  741. X    basename.c dmdump.c macparse.c rulparse.c percent.c function.c
  742. X
  743. # Common Include files.
  744. HDR = dmake.h extern.h struct.h vextern.h patchlvl.h version.h
  745. X
  746. # Define the TARGET we are making, and where the OBJECT files go.
  747. OBJDIR := objects
  748. TARGET  = dmake$E
  749. CFLAGS += -I.
  750. X
  751. # Meta rule for making .o's from .c's (give our own so we can move object
  752. # to objects directory in a portable, compiler independent way)
  753. # Define it before the .INCLUDE so that different OS combinations can redefine
  754. # it.
  755. %$O : %.c
  756. .IF $(SHELL) == mpw
  757. X    %$(CC) $(CFLAGS) -o :$(OBJDIR:s,/,:,):$@ $<
  758. .ELSE
  759. X    %$(CC) -c $(CFLAGS) $<
  760. .IF $(SHELL) != $(COMSPEC)
  761. X    mv $(@:f) $(OBJDIR)
  762. .ELSE
  763. X    +copy $(@:f) $(OBJDIR)
  764. X    +del $(@:f)
  765. .ENDIF
  766. .ENDIF
  767. X
  768. # Pull in the proper configuration files, based on the value of OS.
  769. .INCLUDE : $(OS)/config.mk
  770. .INCLUDE : dbug/dbug.mk
  771. X
  772. # Set the .SOURCE targets so that we look for things in the right place.
  773. .SOURCE.c :^ .NULL
  774. .SOURCE.h :^ .NULL
  775. .SOURCE$O :^ $(OBJDIR)
  776. .PRECIOUS : $(HDR)
  777. X
  778. # Must come after the above INCLUDE so that it gets ALL objects.
  779. OBJECTS    := {$(ASRC:b) $(SRC:b)}$O
  780. X
  781. # The main target, make sure the objects directory exists first.
  782. # LDARGS is defined in config.mk file of each OS/OSRELEASE combination.
  783. all : $(TARGET) $(STARTUP);
  784. $(TARGET)  : $(OBJDIR)
  785. $(TARGET)  : $(OBJECTS);$(LD) $(LDARGS)
  786. .IF $(SHELL) == mpw
  787. $(STARTUP) : $(ENVDIR)$(STARTUP); duplicate :$(<:s,/,:,) $@
  788. .ELSE
  789. $(STARTUP) : $(ENVDIR)$(STARTUP); $(eq,$(SHELL),$(COMSPEC) +copy cp) $< $@
  790. .ENDIF
  791. X
  792. # how to make public.h
  793. public .PHONY : $(PUBLIC);
  794. $(PUBLIC) .SHELL .NOSTATE: $(SRC)
  795. X    genpub -n DMAKE $< >$@
  796. X    rcsclean $@ > /dev/null
  797. X
  798. # Other obvious targets...
  799. .IF $(SHELL) == mpw
  800. $(OBJDIR):;-newfolder $@
  801. .ELSE
  802. $(OBJDIR):;-$(eq,$(SHELL),$(COMSPEC) +md mkdir) $@
  803. .ENDIF
  804. X
  805. # remaining dependencies should be automatically generated
  806. sysintf$O  : $(OS)/sysintf.h
  807. ruletab$O  : $(OS)/startup.h  #khc 01NOV90 - dependency was missing
  808. $(OBJECTS) : $(HDR)
  809. X
  810. clean:;+- $(RM) -rf dmake$E dbdmake$E objects* $(STARTUP) _*state*.mk
  811. X
  812. # Rules for making the manual pages.
  813. man .SETDIR=man : dmake.nc dmake.uue ;
  814. dmake.nc : dmake.p ; scriptfix < $< > $@
  815. dmake.p  : dmake.tf; typeset -man -Tdumb $< > $@
  816. dmake.uue : dmake.p
  817. X    compress -b 12 dmake.p
  818. X    mv dmake.p.Z dmake.Z
  819. X    uuencode dmake.Z dmake.Z >dmake.uue
  820. X    /bin/rm -f dmake.Z
  821. X
  822. #--------------------------------------------------------------------------
  823. # Make the various archives for shipping the thing around.
  824. #
  825. archives : zoo tar shar;
  826. X
  827. zoo  .PHONY : dmake.zoo ;
  828. shar .PHONY : dmake.shar;
  829. tar  .PHONY : dmake.tar;
  830. X
  831. dmake.zoo  : dir-copy
  832. [
  833. X    find dmake -type f -print | zoo aI $@
  834. X    $(RM) -rf src-list dmake
  835. ]
  836. X
  837. dmake.shar : dir-copy
  838. [
  839. X    find dmake -type f -print >src-list
  840. X    xshar -vc -o$@ -L40 `cat src-list`
  841. X    $(RM) -rf src-list dmake
  842. ]
  843. X
  844. dmake.tar : dir-copy
  845. [
  846. X    tar cf $@ dmake
  847. X    $(RM) -rf src-list dmake
  848. ]
  849. X
  850. dir-copy .PHONY : src-list
  851. [
  852. X    echo 'tmp.tar .SILENT :$$(ALLSRC) ;tar -cf tmp.tar $$(ALLSRC)' >> $<
  853. X    $(MAKECMD) -f $< tmp.tar
  854. X    mkdir dmake
  855. X    cd dmake
  856. X    tar xf ../tmp.tar; chmod -R u+rw .
  857. X    cd ..
  858. X    /bin/rm -f tmp.tar
  859. ]
  860. X
  861. src-list : clean man
  862. X    echo 'ALLSRC = \' >$@
  863. X    find . -type f -print |\
  864. X    sed -e 's/RCS\///' -e 's/,v//' -e 's/$$/\\/' -e 's/^\.\// /'|\
  865. X    sort -u |\
  866. X    grep -v tst | grep -v $@ | grep -v LICENSE |\
  867. X    grep -v '\.zoo' | grep -v '\.tar'| grep -v '\.shar' >> $@
  868. X    echo ' LICENSE' >> $@
  869. X
  870. #--------------------------------------------------------------------------
  871. # This section can be used to make the necessary script files so that dmake
  872. # can be bootstrapped.
  873. #
  874. #    dmake scripts    -- makes all the script files at once.
  875. #
  876. SH_n = $(@:s/swp-/-/:s,-,/,:s/scripts/${SCRIPTFILE}/)
  877. MS_n = MAKESTARTUP=$(@:s/swp-/-/:s,-,/,:s/scripts/startup.mk/)
  878. SH = $(SH_n:s/c40d/cd/:s/c50d/cd/:s/c51d/cd/:s/c60d/cd/:s/ibmc2/ibm/)
  879. MS = $(MS_n:s/c40d/cd/:s/c50d/cd/:s/c51d/cd/:s/c60d/cd/:s/ibmc2/ibm/)
  880. FIX-SH = $(SH:s,fix/,,)
  881. X
  882. scripts: unix-scripts atari-tos-scripts msdos-scripts os2-scripts\
  883. X     apple-mac-scripts
  884. X
  885. # To add a new environment for UNIX, simply create the appropriate entry
  886. # in the style below for the macro which contains the OS, OSRELEASE and
  887. # OSENVIRONMENT flags.  Then add the entry as a recipe line for the target
  888. # unix-scripts.
  889. #
  890. unix-bsd43-scripts-flags   = OS=unix OSRELEASE=bsd43  OSENVIRONMENT=
  891. unix-bsd43-uw-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=uw
  892. unix-bsd43-vf-scripts-flags= OS=unix OSRELEASE=bsd43  OSENVIRONMENT=vf
  893. unix-sysvr4-scripts-flags  = OS=unix OSRELEASE=sysvr4 OSENVIRONMENT=
  894. unix-sysvr3-scripts-flags  = OS=unix OSRELEASE=sysvr3 OSENVIRONMENT=
  895. unix-sysvr3-pwd-scripts-flags  = OS=unix OSRELEASE=sysvr3 OSENVIRONMENT=pwd
  896. unix-xenix-scripts-flags  = OS=unix OSRELEASE=xenix OSENVIRONMENT=
  897. unix-xenix-pwd-scripts-flags  = OS=unix OSRELEASE=xenix OSENVIRONMENT=pwd
  898. unix-sysvr1-scripts-flags  = OS=unix OSRELEASE=sysvr1 OSENVIRONMENT=
  899. unix-386ix-scripts-flags   = OS=unix OSRELEASE=386ix  OSENVIRONMENT=
  900. unix-coherent-scripts-flags= OS=unix OSRELEASE=coherent OSENVIRONMENT=
  901. tos--scripts-flags         = OS=tos  OSRELEASE=       OSENVIRONMENT=
  902. mac--scripts-flags         = OS=mac  OSRELEASE=       OSENVIRONMENT=
  903. X
  904. unix-scripts .SWAP : clean
  905. X    $(MAKE) SCRIPTFILE=make.sh unix-bsd43-scripts
  906. X    $(MAKE) SCRIPTFILE=make.sh unix-bsd43-uw-scripts
  907. X    $(MAKE) SCRIPTFILE=make.sh unix-bsd43-vf-scripts
  908. X    $(MAKE) SCRIPTFILE=make.sh unix-sysvr4-scripts
  909. X    $(MAKE) SCRIPTFILE=make.sh unix-sysvr3-scripts
  910. X    $(MAKE) SCRIPTFILE=make.sh unix-sysvr3-pwd-scripts
  911. X    $(MAKE) SCRIPTFILE=make.sh unix-xenix-scripts
  912. X    $(MAKE) SCRIPTFILE=make.sh unix-xenix-pwd-scripts
  913. X    $(MAKE) SCRIPTFILE=make.sh unix-sysvr1-scripts
  914. X    $(MAKE) SCRIPTFILE=make.sh unix-386ix-scripts
  915. X    $(MAKE) SCRIPTFILE=make.sh unix-coherent-scripts
  916. X
  917. unix-%-scripts .SWAP :
  918. X    $(MAKECMD) -s $($@-flags) .KEEP_STATE:= public
  919. X    $(MAKECMD) -ns .KEEP_STATE:= $(MS) $($@-flags) >$(SH)
  920. X
  921. tos-%-scripts .SWAP :
  922. X    $(MAKECMD) -s $($@-flags) .KEEP_STATE:= public
  923. X    $(MAKECMD) -ns .KEEP_STATE:= $(MS) $($@-flags) >$(SH)
  924. X
  925. atari-tos-scripts .SWAP : clean
  926. X    $(MAKE) SCRIPTFILE=make.sh tos--scripts
  927. X
  928. apple-mac-scripts .SWAP : clean
  929. X    $(MAKE) SCRIPTFILE=make.sh mac--scripts
  930. X
  931. mac-%-scripts .SWAP :
  932. X    $(MAKECMD) -s $($@-flags) .KEEP_STATE:= public
  933. X    $(MAKECMD) -ns .KEEP_STATE:= $(MS) $($@-flags) >$(SH)
  934. X    sed 's/ mac\/\(.*\)$$/ :mac:\1/' <$(SH) >/tmp/t
  935. X    /bin/mv /tmp/t $(SH)
  936. X
  937. # We make the standard dos scripts here, but we have to go and fix up the
  938. # mkXX.bat file since it contains names of temporary files for the response
  939. # files required by the linker.  We need to also construct the response file
  940. # contents.  These two functions are performed by the fix-msdos-%-scripts
  941. # meta-target.
  942. #
  943. # To add a new DOS environment just do what is described for adding a new
  944. # unix environment, and then make certain that the fix-msdos-%-scripts target
  945. # performs the correct function for the new environment.
  946. msdos-cf = OS=msdos OSENVIRONMENT=
  947. msdos-tccdos-scripts-flags = $(msdos-cf) OSRELEASE=tccdos SWAP=n
  948. msdos-tccdosswp-scripts-flags = $(msdos-cf) OSRELEASE=tccdos
  949. msdos-bccdos-scripts-flags = $(msdos-cf) OSRELEASE=bccdos SWAP=n
  950. msdos-bccdosswp-scripts-flags = $(msdos-cf) OSRELEASE=bccdos
  951. msdos-msc40dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=4.0
  952. msdos-msc40dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=4.0
  953. msdos-msc50dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.0
  954. msdos-msc50dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=5.0
  955. msdos-msc51dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.1
  956. msdos-msc51dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=5.1
  957. msdos-msc60dos-scripts-flags= $(msdos-cf) OSRELEASE=mscdos SWAP=n MSC_VER=6.0
  958. msdos-msc60dosswp-scripts-flags = $(msdos-cf) OSRELEASE=mscdos MSC_VER=6.0
  959. msdos-ztcdos-scripts-flags= $(msdos-cf) OSRELEASE=ztcdos SWAP=n
  960. msdos-ztcdosswp-scripts-flags= $(msdos-cf) OSRELEASE=ztcdos
  961. X
  962. msdos-scripts: clean\
  963. X           msdos-tcc-scripts msdos-bcc-scripts\
  964. X           msdos-msc-scripts msdos-ztc-scripts;
  965. X
  966. msdos-tcc-scripts .SWAP :
  967. X    $(MAKE) SCRIPTFILE=mk.bat msdos-tccdos-scripts
  968. X    $(MAKE) SCRIPTFILE=mkswp.bat msdos-tccdosswp-scripts
  969. X
  970. msdos-bcc-scripts .SWAP :
  971. X    $(MAKE) SCRIPTFILE=mk.bat msdos-bccdos-scripts
  972. X    $(MAKE) SCRIPTFILE=mkswp.bat msdos-bccdosswp-scripts
  973. X
  974. msdos-msc-scripts .SWAP :! 40 50 51 60
  975. X    $(MAKE) SCRIPTFILE=mk$?.bat msdos-msc$?dos-scripts
  976. X    $(MAKE) SCRIPTFILE=mk$?swp.bat msdos-msc$?dosswp-scripts
  977. X
  978. msdos-ztc-scripts .SWAP :
  979. X    $(MAKE) SCRIPTFILE=mk.bat msdos-ztcdos-scripts
  980. X    $(MAKE) SCRIPTFILE=mkswp.bat msdos-ztcdosswp-scripts
  981. X
  982. msdos-%-scripts .SWAP .SILENT:
  983. X    $(MAKE) -s $($@-flags) .KEEP_STATE:= public
  984. X    $(MAKE) -ns SHELL=command.com COMSPEC=command.com .KEEP_STATE:= $(MS) $($@-flags) >$(SH)
  985. X    $(MAKE) -s $(MAKEMACROS) $(MS) $($@-flags) fix-msdos-$*-scripts
  986. X
  987. X
  988. # We make the standard OS/2 scripts here, but we have to go and fix up the
  989. # mkXX.cmd file since it contains names of temporary files for the response
  990. # files required by the linker.  We need to also construct the response file
  991. # contents.  These two functions are performed by the fix-msdos-%-scripts
  992. # meta-target.
  993. #
  994. # To add a new OS/2 environment just do what is described for adding a new
  995. # unix environment, and then make certain that the fix-msdos-%-scripts target
  996. # performs the correct function for the new environment.
  997. os2-cf = OS=os2 OSENVIRONMENT=
  998. os2-msc40dos-scripts-flags= $(os2-cf) OSRELEASE=mscdos SWAP=n MSC_VER=4.0
  999. os2-msc50dos-scripts-flags= $(os2-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.0
  1000. os2-msc51dos-scripts-flags= $(os2-cf) OSRELEASE=mscdos SWAP=n MSC_VER=5.1
  1001. os2-msc60dos-scripts-flags= $(os2-cf) OSRELEASE=mscdos SWAP=n MSC_VER=6.0
  1002. os2-ibmc2-scripts-flags=    $(os2-cf) OSRELEASE=ibm SWAP=n MSC_VER=5.1
  1003. X
  1004. os2-scripts: clean os2-msc-scripts os2-ibm-scripts;
  1005. X
  1006. os2-msc-scripts .SWAP :! 40 50 51 60
  1007. X    $(MAKE) SCRIPTFILE=mk$?.cmd os2-msc$?dos-scripts
  1008. X
  1009. os2-ibm-scripts .SWAP :! c2
  1010. X    $(MAKE) SCRIPTFILE=mk$?.cmd os2-ibm$?-scripts
  1011. X
  1012. os2-%-scripts .SWAP :
  1013. X    $(MAKE) -s $($@-flags) .KEEP_STATE:= public
  1014. X    $(MAKE) -ns SHELL=cmd.exe COMSPEC=cmd.exe .KEEP_STATE:= $(MS) $($@-flags) >$(SH)
  1015. X    $(MAKE) -s $(MAKEMACROS) $(MS) $($@-flags) fix-os2-$*-scripts
  1016. X
  1017. # Signify NULL targets for the various MSC compiler versions.
  1018. c2 40 50 51 60:;
  1019. X
  1020. # Go over the created script file and make sure all the '/' that are in
  1021. # filenames are '\', and make sure the final link command line looks
  1022. # reasonable.
  1023. MAPOBJ = obj$(SWAP:s/y/swp/:s/n//).rsp
  1024. MAPLIB = lib$(SWAP:s/y/swp/:s/n//).rsp
  1025. OBJRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPOBJ},)
  1026. LIBRSP = $(SH:s,fix/,,:s,${SCRIPTFILE},${MAPLIB},)
  1027. DOSOBJ = $(CSTARTUP) $(OBJDIR)/{$(OBJECTS)}
  1028. fix-%-scripts:
  1029. X    tail -r $(FIX-SH) >tmp-sh-r
  1030. X    tail +3 tmp-sh-r | sed -e 's,/,\\,g' >tmp-out
  1031. X    tail -r tmp-out >$(FIX-SH)
  1032. X    head -2 tmp-sh-r |\
  1033. X    sed -e 's,\\usr\\tmp\\mkA[a-zA-Z]*[0-9]*,$(OBJRSP),'\
  1034. X        -e 's,\\usr\\tmp\\mkB[a-zA-Z]*[0-9]*,$(LIBRSP),' |\
  1035. X    sed -e 's,$(OS)/,$(OS)\\,g'\
  1036. X        -e 's,$(OS)/$(OSRELEASE)/,$(OS)\\$(OSRELEASE)\\,g'\
  1037. X        -e 's,$(OS)\\$(OSRELEASE)/,$(OS)\\$(OSRELEASE)\\,g'\
  1038. X        -e 's,$(OS)/$(OSRELEASE)\\,$(OS)\\$(OSRELEASE)\\,g' >>$(FIX-SH)
  1039. X    rm -f tmp-sh-r tmp-out
  1040. X    mv <+$(DOSOBJ:s,/,\\,:t"+\n")\n+> $(OBJRSP)
  1041. X    mv <+$(LDLIBS:s,/,\\,:t"+\n")\n+> $(LIBRSP)
  1042. SHAR_EOF
  1043. chmod 0640 dmake/makefile.mk ||
  1044. echo 'restore of dmake/makefile.mk failed'
  1045. Wc_c="`wc -c < 'dmake/makefile.mk'`"
  1046. test 12374 -eq "$Wc_c" ||
  1047.     echo 'dmake/makefile.mk: original size 12374, current size' "$Wc_c"
  1048. rm -f _shar_wnt_.tmp
  1049. fi
  1050. # ============= dmake/makefile ==============
  1051. if test -f 'dmake/makefile' -a X"$1" != X"-c"; then
  1052.     echo 'x - skipping dmake/makefile (File already exists)'
  1053.     rm -f _shar_wnt_.tmp
  1054. else
  1055. > _shar_wnt_.tmp
  1056. sed 's/^X//' << 'SHAR_EOF' > 'dmake/makefile' &&
  1057. # Default makefile for the various versions of dmake that we
  1058. # have available.  This is a bootstrap version and uses /bin/sh to
  1059. # execute a script which compiles dmake.
  1060. #
  1061. # Note the DOS commands actually invoke command.com to run the .bat file
  1062. # to make the script.
  1063. X
  1064. all :
  1065. X    @-echo ""; clear; exit 0
  1066. X    @echo "INDEX:  You must specify 'make target' where target is one of:"
  1067. X    @echo "-------------"
  1068. X    @echo "   make bsd43         - Generic BSD 4.3 System"
  1069. X    @echo "   make bsd43uw       - Generic BSD 4.3 at U of Waterloo"
  1070. X    @echo "   make bsd43vf       - Generic BSD 4.3 that needs vfprintf"
  1071. X    @echo "   make sysvr4        - Generic SysV R4 UNIX System"
  1072. X    @echo "   make sysvr3        - Generic SysV R3 UNIX System"
  1073. X    @echo "   make sysvr3pwd     - Generic SysV R3 UNIX System, our PWD"
  1074. X    @echo "   make sysvr1        - Generic SysV R1 UNIX System"
  1075. X    @echo "   make dynix         - Sequent DYNIX System"
  1076. X    @echo "   make ultrix        - Ultrix 3.0 System"
  1077. X    @echo "   make mips          - Any MIPS System"
  1078. X    @echo "   make coherent      - Any Coherent System"
  1079. X    @echo "   make 386ix         - 386/ix (SysV R3) System"
  1080. X    @echo "   make xenix         - 386 Xenix System"
  1081. X    @echo "   make xenixpwd      - 386 Xenix System, our PWD"
  1082. X    @echo "   make aix           - IBM RS6000/AIX System"
  1083. X    @echo "   make os2msc40      - OS/2 using MSC 4.0 compiler"
  1084. X    @echo "   make os2msc50      - OS/2 using MSC 5.0 compiler"
  1085. X    @echo "   make os2msc51      - OS/2 using MSC 5.1 compiler"
  1086. X    @echo "   make os2msc60      - OS/2 using MSC 6.0 compiler"
  1087. X    @echo "   make tos           - Atari-ST TOS using GCC as compiler"
  1088. X    @echo "   make tcc           - DOS with Turbo C 2.0"
  1089. X    @echo "   make bcc           - DOS with Borland C++ 2.0"
  1090. X    @echo "   make tccswp        - swapping DOS version with Turbo C 2.0"
  1091. X    @echo "   make bccswp        - swapping DOS version with Borland C++ 2.0"
  1092. X    @echo "   make msc40         - DOS with MSC 4.0"
  1093. X    @echo "   make msc50         - DOS with MSC 5.0"
  1094. X    @echo "   make msc51         - DOS with MSC 5.1"
  1095. X    @echo "   make msc60         - DOS with MSC 6.0"
  1096. X    @echo "   make msc40swp      - swapping DOS version with MSC 4.0"
  1097. X    @echo "   make msc50swp      - swapping DOS version with MSC 5.0"
  1098. X    @echo "   make msc51swp      - swapping DOS version with MSC 5.1"
  1099. X    @echo "   make msc60swp      - swapping DOS version with MSC 6.0"
  1100. X    @echo "   make ztc           - DOS with Zortech C++ 2.1"
  1101. X    @echo "   make ztcswp        - swapping DOS version with Zortech C++ 2.1"
  1102. X    @echo "   make mpwmac        - Macintosh under MPW"
  1103. X
  1104. ultrix aix: sysvr3;
  1105. X
  1106. sysvr1 sysvr3 sysvr4 bsd43 386ix :; /bin/sh -x < unix/$@/make.sh
  1107. X
  1108. bsd43uw          :; /bin/sh -x < unix/bsd43/uw/make.sh
  1109. bsd43vf dynix mips   :; /bin/sh -x < unix/bsd43/vf/make.sh
  1110. coherent          :; /bin/sh -x < unix/coherent/make.sh
  1111. xenix              :; /bin/sh -x < unix/xenix/make.sh
  1112. xenixpwd          :; /bin/sh -x < unix/xenix/pwd/make.sh
  1113. sysvr3pwd          :; /bin/sh -x < unix/sysvr3/pwd/make.sh
  1114. tos                  :; sh -x tos/make.sh
  1115. mpwmac               :; :mac:make.sh
  1116. X
  1117. # Various OS/2 targets.
  1118. OS2_VER = os2msc40 os2msc50 os2msc51 os2msc60
  1119. $(OS2_VER) :; make.cmd $(@:s/os2//)
  1120. X
  1121. # DOS with some form of make and sh
  1122. # Note if you do not have a 'make and/or sh' program under MSDOS then
  1123. # typing 'make' in the dmake distribution directory will invoke the make.bat
  1124. # batch file which will issue the appropriate instructions.
  1125. DOS_VER = tcc    msc40    msc50    msc51    msc60 \
  1126. X      tccswp msc40swp msc50swp msc51swp msc60swp \
  1127. X      bcc    bccswp   ztc      ztcswp
  1128. $(DOS_VER) :; make.bat $@
  1129. SHAR_EOF
  1130. chmod 0640 dmake/makefile ||
  1131. echo 'restore of dmake/makefile failed'
  1132. Wc_c="`wc -c < 'dmake/makefile'`"
  1133. test 3491 -eq "$Wc_c" ||
  1134.     echo 'dmake/makefile: original size 3491, current size' "$Wc_c"
  1135. rm -f _shar_wnt_.tmp
  1136. fi
  1137. # ============= dmake/man/README ==============
  1138. if test ! -d 'dmake/man'; then
  1139.     mkdir 'dmake/man'
  1140. fi
  1141. if test -f 'dmake/man/README' -a X"$1" != X"-c"; then
  1142.     echo 'x - skipping dmake/man/README (File already exists)'
  1143.     rm -f _shar_wnt_.tmp
  1144. else
  1145. > _shar_wnt_.tmp
  1146. sed 's/^X//' << 'SHAR_EOF' > 'dmake/man/README' &&
  1147. To unpack the DMAKE manual page please issue the following sequence of
  1148. commands:
  1149. X
  1150. X    uudecode dmake.uue
  1151. X    uncompress dmake.Z
  1152. X    mv dmake dmake.p
  1153. X
  1154. NOTE:  You only need to do this if you cannot typeset the manual page
  1155. X       yourself.
  1156. SHAR_EOF
  1157. chmod 0640 dmake/man/README ||
  1158. echo 'restore of dmake/man/README failed'
  1159. Wc_c="`wc -c < 'dmake/man/README'`"
  1160. test 228 -eq "$Wc_c" ||
  1161.     echo 'dmake/man/README: original size 228, current size' "$Wc_c"
  1162. rm -f _shar_wnt_.tmp
  1163. fi
  1164. # ============= dmake/man/dmake.nc ==============
  1165. if test -f 'dmake/man/dmake.nc' -a X"$1" != X"-c"; then
  1166.     echo 'x - skipping dmake/man/dmake.nc (File already exists)'
  1167.     rm -f _shar_wnt_.tmp
  1168. else
  1169. > _shar_wnt_.tmp
  1170. sed 's/^X//' << 'SHAR_EOF' > 'dmake/man/dmake.nc' &&
  1171. X
  1172. X
  1173. X
  1174. X
  1175. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  1176. X
  1177. X
  1178. X
  1179. NAME
  1180. X     dmake - maintain program groups, or interdependent files
  1181. X
  1182. SYNOPSIS
  1183. X     dmake [-ABceEhiknpqrsStTuVx] [-v{dfimt}] [-P#] [-{f|C|K}
  1184. X     file] [macro[*][+][:]=value ...] [target ...]
  1185. X
  1186. DESCRIPTION
  1187. X     dmake executes commands found in an external file called a
  1188. X     makefile to update one or more target names.  Each target
  1189. X     may depend on zero or more prerequisite targets.  If any of
  1190. X     the target's prerequisites is newer than the target or if
  1191. X     the target itself does not exist, then dmake will attempt to
  1192. X     make the target.
  1193. X
  1194. X     If no -f command line option is present then dmake searches
  1195. X     for an existing makefile from the list of prerequisites
  1196. X     specified for the special target .MAKEFILES (see the STARTUP
  1197. X     section for more details).  If "-" is the name of the file
  1198. X     specified to the -f flag then dmake uses standard input as
  1199. X     the source of the makefile text.
  1200. X
  1201. X     Any macro definitions (arguments with embedded "=" signs)
  1202. X     that appear on the command line are processed first and
  1203. X     supersede definitions for macros of the same name found
  1204. X     within the makefile.  In general it is impossible for defin-
  1205. X     itions found inside the makefile to redefine a macro defined
  1206. X     on the command line, see the MACROS section for an excep-
  1207. X     tion.
  1208. X
  1209. X     If no target names are specified on the command line, then
  1210. X     dmake uses the first non-special target found in the
  1211. X     makefile as the default target.  See the SPECIAL TARGETS
  1212. X     section for the list of special targets and their function.
  1213. X     dmake is a re-implementation of the UNIX Make utility with
  1214. X     significant enhancements.  Makefiles written for most previ-
  1215. X     ous versions of Make will be handled correctly by dmake.
  1216. X     Known differences between dmake and other versions of make
  1217. X     are discussed in the COMPATIBILITY section found at the end
  1218. X     of this document.
  1219. X
  1220. OPTIONS
  1221. X     -A   Enable AUGMAKE special inference rule transformations
  1222. X          (see the "PERCENT(%) RULES" section), these are set to
  1223. X          off by default.
  1224. X
  1225. X     -B   Enable the use of spaces instead of <tabs> to begin
  1226. X          recipe lines.  This flag equivalent to the .NOTABS spe-
  1227. X          cial macro and is further described below.
  1228. X
  1229. X     -c   Use non-standard comment stripping.  If you specify -c
  1230. X          then dmake will treat any # character as a start of
  1231. X
  1232. X
  1233. X
  1234. Version 3.70                    UW                              1
  1235. X
  1236. X
  1237. X
  1238. X
  1239. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  1240. X
  1241. X
  1242. X
  1243. X          comment character wherever it may appear unless it is
  1244. X          escaped by a \.
  1245. X
  1246. X     -C [+]file
  1247. X          This option writes to file a copy of standard output
  1248. X          and standard error from any child processes and from
  1249. X          the dmake process itself.  If you specify a + prior to
  1250. X          the file name then the text is appended to the previous
  1251. X          contents of file.  This option is active in the MSDOS
  1252. X          implementation only and is ignored by non-MSDOS ver-
  1253. X          sions of dmake.
  1254. X
  1255. X     -E   Read the environment and define all strings of the form
  1256. X          'ENV-VAR=evalue' defined within as macros whose name is
  1257. X          ENV-VAR, and whose value is 'evalue'.  The environment
  1258. X          is processed prior to processing the user specified
  1259. X          makefile thereby allowing definitions in the makefile
  1260. X          to override definitions in the environment.
  1261. X
  1262. X     -e   Same as -E, except that the environment is processed
  1263. X          after the user specified makefile has been processed
  1264. X          (thus definitions in the environment override defini-
  1265. X          tions in the makefile).  The -e and -E options are
  1266. X          mutually exclusive.  If both are given the latter takes
  1267. X          effect.
  1268. X
  1269. X     -f file
  1270. X          Use file as the source for the makefile text.  Only one
  1271. X          -f option is allowed.
  1272. X
  1273. X     -h   Print the command summary for dmake.
  1274. X
  1275. X     -i   Tells dmake to ignore errors, and continue making other
  1276. X          targets.  This is equivalent to the .IGNORE attribute
  1277. X          or macro.
  1278. X
  1279. X     -K file
  1280. X          Turns on .KEEP_STATE state tracking and tells dmake to
  1281. X          use file as the state file.
  1282. X
  1283. X     -k   Causes dmake to ignore errors caused by command execu-
  1284. SHAR_EOF
  1285. true || echo 'restore of dmake/man/dmake.nc failed'
  1286. fi
  1287. echo 'End of part 13, continue with part 14'
  1288. echo 14 > _shar_seq_.tmp
  1289. exit 0
  1290. exit 0 # Just in case...
  1291.